home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / eqnarray / eqnarray.dtx (.txt) < prev   
LaTeX Document  |  1995-03-09  |  9KB  |  247 lines

  1. \def\fileversion{1.1}
  2. \def\filedate{jan 1993}
  3. \def\docdate{9 jan 1995}
  4. % \MakeShortVerb{\|}
  5. % \title{The |equationarray| environment}
  6. % \author{Roland Winkler\\roland.winkler@physik.uni-regensburg.de}
  7. % \maketitle
  8. % \begin{abstract}\noindent
  9. % The |equationarray| combines the |eqnarray| and the |array| environment.
  10. % \end{abstract}
  11. % \section{Introduction}
  12. % Problem: The |eqnarray| environment is too restrictive because it is
  13. % only prepared to accept three part equations.  Some applications
  14. % require more sophisticated mathematics, so three parts aren't
  15. % enough.  Simultaneously, we would like to have our equations
  16. % numbered.  If the equations aren't to be numbered, then the |array|
  17. % environment suffices (nevertheless it is often easier to use the
  18. % |equationarray*| environment than both an |equation| plus an |array| 
  19. % environment).  If the equations aren't to be aligned with
  20. % each other, then the |equation| environment is preferred.
  21. % The following is a new version of Tony Li's |equationarray|
  22. % environment modified such that it is compatible with Frank Mittelbach's
  23. % |array| environment, i.e. it should be possible to use all options
  24. % of the |array| environment. If you find a bug (see below!) or
  25. % if you make any improvements, I'd like to hear about them.
  26. % When writing the |equationarray| environment I used the
  27. % version v2.1b of the |array| environment. The original version of
  28. % |equationarray| was written by Tony Li, University of Southern
  29. % California, tli@sargas.usc.edu starting 6/15/88.
  30. % I know that my documentation of the |equationarray| environment is
  31. % rather short -- but maybe nobody else might like to use it and
  32. % even this work was superfluous. So if you think that it would be
  33. % useful to have a better documentation please let me know.
  34. % \section{Example}
  35. % We give a short example for the use of |equationarray|. The
  36. % text is
  37. % \begin{verbatim}
  38. % \newcolumntype{e}{@{}}
  39. % \begin{equationarray}{rclel}
  40. % \phi & = & \sum \bigg( & \frac{xxxxxxxxxx}{\phi} 
  41. % \nonumber\\*[3ex]
  42. % & & & + \frac{yyyyyyyyyy}{\phi} \bigg) \\[4ex]
  43. % & = & \multicolumn{2}{l}{ \frac{zzzzzzzzzz}{\phi} }
  44. % \end{equationarray}
  45. % \end{verbatim}
  46. % and we obtain (usually my formulas are much longer $\ldots$)
  47. % \newcolumntype{e}{@{}}
  48. % \begin{equationarray}{rclel}
  49. % \phi & = & \sum \bigg( & \frac{xxxxxxxxxx}{\phi} 
  50. % \nonumber\\*[3ex]
  51. % & & & + \frac{yyyyyyyyyy}{\phi} \bigg) \\[4ex]
  52. % & = & \multicolumn{2}{l}{ \frac{zzzzzzzzzz}{\phi} }
  53. % \end{equationarray}
  54. % One can avoid pagebreaks between two lines by using the
  55. % star-version |\\*|. There is also the star-version |equationarray*|
  56. % which has usually no linenumbers. But if for a particular line you
  57. % still want a linenumber, you can use |\yesnumber|, (I find this
  58. % easier than many lines with |\nonumber|). With the options |[l]|
  59. % or |[r]| the |equationarray| will appear flushleft or flushright,
  60. % e.g. |\begin{equationarray}[l]{rclll}|.
  61. % \section{Bugs}
  62. % The equationarray has a slightly modified version of
  63. % |\multicolumn| because we must count the |\span|ed columns. Thus
  64. % if you have |\multicolumn| within an |array| within the
  65. % |equationarray| environment, then you might run into difficulties
  66. % if you have a line with less |&|'s than tokens in the preamble.
  67. % Thus you can either fill up the end of a half empty line with
  68. % extra |&|'s or you can put the original definition of
  69. % |\multicolumn| within the definition of the |array| command.
  70. %  \section{The code}
  71. %    \begin{macrocode}
  72. \typeout{equationarray \fileversion\space<\filedate>}
  73. \typeout{English documentation\space\space<\docdate>}
  74. %    \end{macrocode}
  75. % \begin{macro}{\equationarray}
  76. %    \begin{macrocode}
  77. \def\equationarray{%
  78.  \col@sep\arraycolsep
  79.  \def\d@llarbegin{$\displaystyle}%
  80.  \def\d@llarend{$}%
  81.  \stepcounter{equation}%
  82.  \let\@currentlabel=\theequation
  83.  \set@eqnsw \global\@eqcnt\z@ \global\@eqargcnt\z@
  84.  \let\@classz\@eqnclassz
  85.  \def\multicolumn##1##2##3{\@eqnmulticolumn{##1}{##2}{##3}%
  86.                            \global\advance\@eqcnt##1
  87.                            \global\advance\@eqcnt\m@ne}%
  88.  \def\@halignto{to\displaywidth}%
  89.  \@ifnextchar[{\@equationarray}{\@equationarray[c]}}
  90. %    \end{macrocode}
  91. % \end{macro}
  92. % \begin{macro}{\@eqnmulticolumn}
  93. % |\@eqnmulticolumn| equals the original version of |\multicolumn|.
  94. %    \begin{macrocode}
  95. \let\@eqnmulticolumn=\multicolumn
  96. %    \end{macrocode}
  97. % \end{macro}
  98. % \begin{macro}{\nonumber,\yesnumber}
  99. % Note, that |\nonumber| is already defined in standard latex.tex
  100. %    \begin{macrocode}
  101. % \def\nonumber{\global\@eqnswfalse}
  102. \def\yesnumber{\global\@eqnswtrue}
  103. \let\set@eqnsw=\yesnumber
  104. %    \end{macrocode}
  105. % \end{macro}
  106. % \begin{macro}{\@amper}
  107. % We need a macro for |&| that expands at the right time.
  108. %    \begin{macrocode}
  109. \def\@amper{&}
  110. %    \end{macrocode}
  111. % \end{macro}
  112. % \begin{macro}{\@eqargcnt}
  113. % We must count the number of arguments (tokens) in the preamble so
  114. % that we can fill every line with exactly |\@eqargcnt| copies of
  115. % |&| before we insert the equation number.
  116. %    \begin{macrocode}
  117. \newcount\@eqargcnt  % counts number of columns
  118. %    \end{macrocode}
  119. % \end{macro}
  120. % \begin{macro}{\@equationarray}
  121. % The definition of |\@equationarray| follows the \TeX book,
  122. % Exercise 22.9
  123. %    \begin{macrocode}
  124. \def\@equationarray[#1]#2{%
  125.      \@tempdima \ht \strutbox
  126.      \advance \@tempdima by\extrarowheight
  127.      \setbox\@arstrutbox=\hbox{\vrule
  128.                \@height\arraystretch \@tempdima
  129.                \@depth\arraystretch \dp \strutbox
  130.                \@width\z@}%
  131.      \gdef\advance@eqargcnt{\global\advance\@eqargcnt\@ne}%
  132.      \begingroup
  133.      \@mkpream{#2}%
  134.      \xdef\@preamble{%
  135.       \if #1l\tabskip\z@ \else\if #1r\tabskip\@centering
  136.                          \else\tabskip\@centering \fi\fi
  137.       \halign \@halignto
  138.       \bgroup \tabskip\z@ \@arstrut \@preamble
  139.       \if #1l\tabskip\@centering \else\if #1r\tabskip\z@
  140.                                  \else\tabskip\@centering \fi\fi
  141. %    \end{macrocode}
  142. % Here we need an extra column for the equation-number
  143. %    \begin{macrocode}
  144.       \@amper\llap{\@sharp}\tabskip\z@\cr}%
  145.      \endgroup
  146.      \gdef\advance@eqargcnt{}%
  147.      \bgroup
  148.      \let\@sharp## \let\protect\relax
  149.      \m@th   \let\\=\@equationcr
  150.      \let\par\@empty
  151.      $$                            % $$ BRACE MATCHING HACK
  152.      \lineskip \z@
  153.      \baselineskip \z@
  154.      \@preamble}
  155. %    \end{macrocode}
  156. % \end{macro}
  157. % \begin{macro}{\@eqnclassz}
  158. % |\@eqnclassz| does the same thing as |\@classz| except that we add\\
  159. % |\advance@eqargcnt|
  160. %    \begin{macrocode}
  161. \def\@eqnclassz{\@classx
  162.    \@tempcnta \count@
  163.    \advance@eqargcnt
  164.    \prepnext@tok
  165.    \@addtopreamble{%
  166.       \global\advance\@eqcnt\@ne
  167.       \ifcase \@chnum
  168.       \hfil \d@llarbegin \insert@column \d@llarend\hfil \or
  169.       \d@llarbegin \insert@column \d@llarend \hfil \or
  170.       \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or
  171.       $\vcenter
  172.       \@startpbox{\@nextchar}\insert@column \@endpbox $\or
  173.       \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
  174.       \vbox \@startpbox{\@nextchar}\insert@column \@endpbox
  175.       \fi}\prepnext@tok}
  176. %    \end{macrocode}
  177. % \end{macro}
  178. % \begin{macro}{\endequationarray}
  179. %    \begin{macrocode}
  180. \def\endequationarray{\@zequationcr
  181.    \egroup
  182.    \global\advance\c@equation\m@ne $$  % $$ BRACE MATCHING HACK
  183.    \egroup\global\@ignoretrue
  184.    \gdef\@preamble{}}
  185. %    \end{macrocode}
  186. % \end{macro}
  187. % \begin{macro}{\@equationcr}
  188. % If we have |\\*| the command |\@equationcr| avoids pagebreaks
  189. %    \begin{macrocode}
  190. \def\@equationcr{${\ifnum0=`}\fi\@ifstar{\global\@eqpen\@M
  191.     \@xequationcr}{\global\@eqpen\interdisplaylinepenalty
  192.                    \@xequationcr}}
  193. %    \end{macrocode}
  194. % \end{macro}
  195. % \begin{macro}{\@xequationcr}
  196. %    \begin{macrocode}
  197. \def\@xequationcr{%
  198.     \@ifnextchar[{\@argequationcr}{\ifnum0=`{\fi}${}%
  199.     \@zequationcr}}
  200. %    \end{macrocode}
  201. % \end{macro}
  202. % \begin{macro}{\@argequationcr}
  203. %    \begin{macrocode}
  204. \def\@argequationcr[#1]{\ifnum0=`{\fi}${}\ifdim #1>\z@
  205.    \@xargequationcr{#1}\else
  206.    \@yargequationcr{#1}\fi}
  207. %    \end{macrocode}
  208. % \end{macro}
  209. % \begin{macro}{\@xargequationcr}
  210. %    \begin{macrocode}
  211. \def\@xargequationcr#1{\unskip
  212.    \@tempdima #1\advance\@tempdima \dp \@arstrutbox
  213.    \vrule \@depth\@tempdima \@width\z@
  214.    \@zequationcr\noalign{\penalty\@eqpen}}
  215. %    \end{macrocode}
  216. % \end{macro}
  217. % \begin{macro}{\@yargequationcr}
  218. %    \begin{macrocode}
  219. \def\@yargequationcr#1{%
  220.    \@zequationcr\noalign{\penalty\@eqpen\vskip #1}}
  221. %    \end{macrocode}
  222. % We add |&\omit| for those columns that will remain empty.
  223. % Note that without |\omit| we already have |\advance\@eqcnt\@ne| in
  224. % the preamble.
  225. %    \begin{macrocode}
  226. \def\@zequationcr{\@whilenum\@eqcnt <\@eqargcnt
  227.    \do{\@amper\omit\global\advance\@eqcnt\@ne}%
  228. %    \end{macrocode}
  229. % We add an extra alignment tab for the equationnumber
  230. %    \begin{macrocode}
  231.    \@amper
  232.    \if@eqnsw\@eqnnum\stepcounter{equation}\fi
  233.    \set@eqnsw\global\@eqcnt\z@\cr}
  234. %    \end{macrocode}
  235. % \end{macro}
  236. % \begin{macro}{\equationarray*}
  237. % Finally we define the |equationarray*| environment. It does exactly
  238. % the same thing as |\equationarray| except that we |\let| the command
  239. % |\set@eqnsw| equal |\nonumber|
  240. %    \begin{macrocode}
  241. \@namedef{equationarray*}{%
  242.    \let\set@eqnsw=\nonumber \equationarray}
  243. \@namedef{endequationarray*}{\endequationarray}
  244. %    \end{macrocode}
  245. % \end{macro}
  246. \endinput
  247.